import { AmbientLight, ColorRepresentation, DirectionalLight, HemisphereLight, PointLight, RectAreaLight, SpotLight } from "three";

export class ThreeLight {
    /**
     * 环境光会均匀的照亮场景中的所有物体。
     * 环境光不能用来投射阴影，因为它没有方向。
     * @param color (可选参数) 16进制表示光的颜色。 缺省值 0xffffff (白色)。
     * @param intensity (可选参数) 光照强度。 缺省值 1。
     */
    ambient(color?: ColorRepresentation, intensity?: number) {
        return new AmbientLight(color, intensity)
    }

    /**
     * 平行光是沿着特定方向发射的光。这种光的表现像是无限远,从它发出的光线都是平行的。
     * 常常用平行光来模拟太阳光 的效果; 太阳足够远，因此我们可以认为太阳的位置是无限远，
     * 所以我们认为从太阳发出的光线也都是平行的。
     * 平行光可以投射阴影
     */
    directional(color?: ColorRepresentation, intensity?: number) {
        return new DirectionalLight(color, intensity)
    }

    /**
     * 光源直接放置于场景之上，光照颜色从天空光线颜色渐变到地面光线颜色。
     * 半球光不能投射阴影。
     */
    hemisphere(color?: ColorRepresentation, intensity?: number) {
        return new HemisphereLight(color, intensity)
    }

    /**
     * 从一个点向各个方向发射的光源。一个常见的例子是模拟一个灯泡发出的光。
     * 该光源可以投射阴影
     */
    point(color?: ColorRepresentation, intensity?: number) {
        return new PointLight(color, intensity)
    }

    /**
     * 平面光光源从一个矩形平面上均匀地发射光线。这种光源可以用来模拟像明亮的窗户或者条状灯光光源。
     * 不支持阴影。
     * 只支持 MeshStandardMaterial 和 MeshPhysicalMaterial 两种材质。
     */
    rectArea(color?: ColorRepresentation, intensity?: number) {
        return new RectAreaLight(color, intensity)
    }

    /**
     * 光线从一个点沿一个方向射出，随着光线照射的变远，光线圆锥体的尺寸也逐渐增大。
     * 该光源可以投射阴影
     */
    spot(color?: ColorRepresentation, intensity?: number) {
        return new SpotLight(color, intensity)
    }
}